package demo2;

import java.util.*;

public class Test5 {

    public static void main(String[] args) {

        ArrayList<ArrayList<Integer>> grid = new ArrayList<>();

        rotApple(grid);
    }

        /**
         * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
         *
         *
         * @param grid int整型ArrayList<ArrayList<>>
         * @return int整型
         */
    public static int rotApple (ArrayList<ArrayList<Integer>> grid) {
        ArrayList<ArrayList<Boolean>> gridCopy = new ArrayList<>();

        int n = grid.size();
        int m = grid.get(0).size();

        while (true) {
            int count = 0;
            boolean flg = false; // 记录是否修改
            // 遍历设置 gridCopy
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    if(grid.get(i).get(j) == 2) {
                        gridCopy.get(i).set(j, true);
                    }
                }
            }
            // 传播一次
            bread(grid, gridCopy, n, m);
            count++;
            // 判断是否有 1, 没有 1全部腐烂, 返回传播次数,
            if (!haveOne(grid, n, m)) {
                return count;
            }

        }
    }

    // 传播一次
    public static void bread(ArrayList<ArrayList<Integer>> grid, ArrayList<ArrayList<Boolean>> gridCopy, int n, int m) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(gridCopy.get(i).get(j)) {
                    if (i == 0 && j == 0) {
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j+1, 2);
                    }else if (i == 0 && j == m-1) {
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                    }else if (i == n-1 && j == 0) {
                        grid.get(i-1).set(j, 2);
                        grid.get(i).set(j+1, 2);
                    }else if (i == n-1 && j == m-1) {
                        grid.get(i-1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                    } else if (i == 0) {
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                        grid.get(i).set(j+1, 2);
                    } else if (i == m-1) {
                        grid.get(i-1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                        grid.get(i).set(j+1, 2);
                    } else if (j == 0) {
                        grid.get(i-1).set(j, 2);
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j+1, 2);
                    } else if (j == n-1) {
                        grid.get(i-1).set(j, 2);
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                    } else {
                        grid.get(i-1).set(j, 2);
                        grid.get(i+1).set(j, 2);
                        grid.get(i).set(j-1, 2);
                        grid.get(i).set(j+1, 2);
                    }

                }
            }
        }
    }

    // 判断是否有 1
    public static boolean haveOne(ArrayList<ArrayList<Integer>> grid, int n, int m) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid.get(i).get(j) == 1) {
                    return true;
                }
            }
        }
        return false;
    }

}
